<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<script>
    // 父类 - 动物
    function Animal(age) {
        this.age = age
        this.info = {description: '这是一只动物'}
    }

    Animal.prototype.eat = function () {
        console.log('每一种动物都会吃东西')
    }

    // 子类 - 人
    function Person(name, sex, age) {
        this.name = name
        this.sex = sex
        Animal.call(this, age)
    }

    (function () {
        function Super() {
        }

        // 为什么不直接用 Person.prototype = new Animal()，因为这样会调用两次 Animal()，第一次在 Animal.call()
        // 通过将 父类的原型 复制出来，避免调用两次，摒除冗余属性
        Super.prototype = Animal.prototype
        Person.prototype = new Super()
    })()

    Person.prototype.sayName = function () {
        console.log('我的名字是：', this.name)
    }

    // 添加 constructor 属性，使它指向其构造函数
    try {
        Object.defineProperty(Person.prototype, 'constructor', {value: Person})
    } catch (err) {
        Person.prototype.constructor = Person
        console.warn(err.message);
    }

    var p1 = new Person('foo', '男', 18)
    var p2 = new Person('bar', '女', 17)
    p1.eat()
</script>

</body>
</html>
